package com.wlc.base.lambda;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description lambda表达式
 * @date 2021-07-13 19:37
 */
public class TestLambda {

    /**
     * 使用Collection.sort() 排序；
     * Hero 对象实现 Comparable 接口
     */
    public void method01() {
        List<Hero> list = new ArrayList<>();
        list.add(new Hero("zhangsan1", 23, 34));
        list.add(new Hero("zhangsan", 1, 23));
        list.add(new Hero("zhangsan", 98, 45));
        list.add(new Hero("zhangsan", 13, 15));
        list.add(new Hero("zhangsan", 87, 2));
        Collections.sort(list);
        list.forEach(System.out::println);
    }

    /**
     * 初始化10个对象
     * random.nextInt(1000); 随机生成0-1000之间的数字
     *
     * @return
     */
    public static List<Hero> initData() {
        Random random = new Random();
        // 随机生成 0 - 1000之间的随机数

        List<Hero> heroes = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            heroes.add(new Hero("hero-" + i, random.nextInt(1000), random.nextInt(100)));
        }
        return heroes;
    }

    /**
     * 普通的筛选方法
     */
    public void method02() {
        // 初始化数据
        List<Hero> heroes = initData();
        System.out.println("初始化数据完成：");
        // 筛选 hp>100 ,damage <50的英雄
        List<Hero> heroes1 = filterHero(heroes);
        System.out.println("筛选过后的英雄为: ");
        System.out.println(" " + heroes1);

        // 通过匿名的校验器校验
        List<Hero> heroes2 = filterHeroByChecker(heroes);
        System.out.println("通过匿名checker 筛选后的英雄为：");
        System.out.println(" " + heroes2);
        // 通过lambda 表达式的方式校验
        List<Hero> heroes3 = filterHeroByLambda(heroes);
        System.out.println("通过Lambda 筛选过后的英雄为： ");
        System.out.println(" " + heroes3);
        // 在lambda 表达式中使用静态方法
        // 第二个参数是 通过类名来调用 静态方法
        List<Hero> heroes4 = filter01(heroes, TestLambda::testHero);
        System.out.println("引用静态方法 筛选后的英雄为：");
        System.out.println(" " + heroes4);
    }

    /**
     * 静态方法
     * @param hero
     * @return
     */
    public static boolean testHero(Hero hero) {
        return hero.getHp() > 100 && hero.getDamage() < 50;
    }

    private List<Hero> filter01(List<Hero> heroes,HeroChecker heroChecker){
        List<Hero> list = new ArrayList<>();
        for (Hero hero : heroes) {
            if(heroChecker.check(hero)){
                list.add(hero);
            }
        }
        return list;
    }
    /**
     * 通过lambda的方式校验
     *
     * @param heroes
     * @return
     */
    private List<Hero> filterHeroByLambda(List<Hero> heroes) {
        List<Hero> result = new ArrayList<>();
        HeroChecker heroChecker = new HeroChecker() {
            @Override
            public boolean check(Hero hero) {
                return hero.getHp() > 100 && hero.getDamage() < 50;
            }
        };
        // 1 、去掉 new HeroChecker(),方法名，方法返回类型；只留下返回值
        HeroChecker c2 = (Hero hero) -> {
            return hero.getHp() > 100 && hero.getDamage() < 50;
        };
        // 2、去掉return 和 {}
        HeroChecker c3 = (Hero hero) -> hero.getHp() > 100 && hero.getDamage() < 50;
        // 3、把参数和圆括号去掉
        HeroChecker c4 = hero -> hero.getHp() > 100 && hero.getDamage() < 50;
        for (Hero h : heroes) {
            if (c4.check(h)) {
                 result.add(h);
            }
        }
        return result;
    }

    /**
     * 普通的方式检测 英雄的 hp>100 && damage<50 的英雄
     *
     * @param heroes
     * @return
     */
    private List<Hero> filterHero(List<Hero> heroes) {
        List<Hero> result = new ArrayList<>();
        for (Hero hero : heroes) {
            if (hero.getHp() > 100 && hero.getDamage() < 50) {
                result.add(hero);
            }
        }
        return result;
    }

    /**
     * 通过 匿名方法 返回 英雄的 hp>100 && damage<50 的英雄
     *
     * @param heroes
     * @return
     */
    private List<Hero> filterHeroByChecker(List<Hero> heroes) {
        List<Hero> result = new ArrayList<>();
        // 匿名类
        HeroChecker heroChecker = new HeroChecker() {
            @Override
            public boolean check(Hero hero) {
                return (hero.getHp() > 100 && hero.getDamage() < 50);
            }
        };
        for (Hero hero : heroes) {
            if (heroChecker.check(hero)) {
                result.add(hero);
            }
        }
        return result;
    }


    public static void main(String[] args) {
        TestLambda testLambda = new TestLambda();
        testLambda.method02();
    }
}
